/*
 * Copyright (C) 2010-2018 Gordon Fraser, Andrea Arcuri and EvoSuite
 * contributors
 *
 * This file is part of EvoSuite.
 *
 * EvoSuite is free software: you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3.0 of the License, or
 * (at your option) any later version.
 *
 * EvoSuite is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with EvoSuite. If not, see <http://www.gnu.org/licenses/>.
 */
package org.evosuite.runtime.mock.java.net;

import org.evosuite.runtime.vnet.NetworkInterfaceState;
import org.evosuite.runtime.vnet.VirtualNetwork;
import org.junit.Assert;
import org.junit.Test;

import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.List;

public class NetworkInterfaceTest {

    @Test
    public void test() throws SocketException {
        VirtualNetwork.getInstance().init();

        List<NetworkInterfaceState> list =
                VirtualNetwork.getInstance().getAllNetworkInterfaceStates();

        //we want to mock at least 2 interfaces
        Assert.assertTrue(list.size() >= 2);

        boolean loopback = false;
        boolean no_loopback = false;

        for (NetworkInterfaceState nis : list) {
            if (nis.isLoopback()) {
                loopback = true;
            } else {
                no_loopback = true;
            }

            Assert.assertNotNull(nis.getNetworkInterface());
            Assert.assertNotNull(nis.getNetworkInterface().getName());
            Assert.assertFalse(nis.getNetworkInterface().getName().trim().isEmpty());
            Assert.assertTrue(nis.getNetworkInterface().getIndex() > 0); //check that it is set, and we did not put any 0
        }

        //we want to cover both cases
        Assert.assertTrue(loopback);
        Assert.assertTrue(no_loopback);

        int n = 0;
        Enumeration<NetworkInterface> en = MockNetworkInterface.getNetworkInterfaces();
        while (en.hasMoreElements()) {
            n++;
            en.nextElement();
        }

        Assert.assertEquals(list.size(), n);
    }
}
